Skip to content

feat(solana): KKSOLSW1 transaction-bound account attestation on tags 5-7 - #38

Merged
BitHighlander merged 1 commit into
masterfrom
feat/kksolsw1-lut-accounts
Aug 21, 2026
Merged

feat(solana): KKSOLSW1 transaction-bound account attestation on tags 5-7#38
BitHighlander merged 1 commit into
masterfrom
feat/kksolsw1-lut-accounts

Conversation

@BitHighlander

Copy link
Copy Markdown
Owner

A Solana v0 transaction may source instruction accounts from an Address Lookup Table. Those accounts are not in the bytes being signed, so the device cannot derive them and refuses to guess — solana.c:848 skips such an instruction and renders nothing for it, while still signing it.

KKSOLSC1 schemas cannot close this: they are instruction-scoped and reusable, carry no transaction hash, and work by decoding values out of the bytes being signed. With a lookup table, those bytes do not contain the accounts.

So a provider attests the resolved account list for this transaction:

preimage = "KeepKeySolanaTxAccounts/1" || message_hash(32)
           || count(le32) || account[i](32) ...
  • bound to the exact message hash — cannot be replayed onto another transaction
  • domain-tagged — a signature made for any other purpose (EVM metadata, a token definition) cannot be replayed as one

Annotation, not authority. Accounts render as PROVIDER-ATTESTED next to the provider alias, and the normal unverified-transaction review still runs. Additive by construction, because the alternative today is a blank screen.

Uses tags 5–7 of the reservation that named this descriptor; tag 8 stays reserved for one-request opaque-signing consent.

A Solana v0 transaction may source instruction accounts from an Address Lookup
Table. Those accounts are NOT in the bytes being signed, so the device cannot
derive them and refuses to guess: the transaction is forced to
SOL_TX_REVIEW_OPAQUE, which fsm_msg_solana.h refuses outright unless the user
has enabled AdvancedMode, and which is then an explicit BLIND SIGN. The
instruction's meaning is never shown.

So this does not rescue a blank screen -- nothing is signed silently. It
upgrades a BLIND SIGN into a provider-attested CLEAR SIGN, which is the whole
point of the tier.

KKSOLSC1 schemas cannot close this: they are instruction-scoped and reusable,
carry no transaction hash, and work by decoding values out of the bytes the
device is signing. With a lookup table those bytes do not contain the accounts.

So a provider attests the resolved account list for THIS transaction:

  preimage = "KeepKeySolanaTxAccounts/1" || message_hash(32)
             || count(le32) || account[i](32) ...

Bound to the exact message hash, so it cannot be replayed onto another
transaction. Domain-tagged, so a signature made for any other purpose -- an EVM
metadata blob, a token definition -- cannot be replayed as one.

Annotation, not authority: accounts render as PROVIDER-ATTESTED next to the
provider alias, and the unverified-transaction review still runs.

Uses tags 5-7 of the reservation that named this descriptor. Tag 8 stays
reserved for one-request opaque-signing consent.
@BitHighlander
BitHighlander force-pushed the feat/kksolsw1-lut-accounts branch from fc93ba0 to 2190c15 Compare August 21, 2026 18:31
@BitHighlander
BitHighlander merged commit 8545cd5 into master Aug 21, 2026
2 checks passed
@BitHighlander
BitHighlander deleted the feat/kksolsw1-lut-accounts branch August 21, 2026 18:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant